#!/usr/bin/env sh

# Description: Regular mode:
#                Fuzzy find a file in directory subtree.
#                Opens in $VISUAL or $EDITOR if text.
#                Opens other type of files with xdg-open.
#                Work only with a single file selected.
#
#              Picker mode:
#                If picker mode output file is passed, it
#                will be overwritten with any picked files.
#                Leaves untouched if no file is picked.
#                Works with single/multiple files selected.
#
# Dependencies: fd/find, fzf/skim, xdg-open/open (on macOS)
#
# Shell: POSIX compliant
# Author: Arun Prakash Jana

NUKE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins/nuke"
USE_NUKE=0

. "$(dirname "$0")"/.nnn-plugin-helper

if type fzf >/dev/null 2>&1; then
    cmd="$FZF_DEFAULT_COMMAND"
    if type fd >/dev/null 2>&1; then
        [ -z "$cmd" ] && cmd="fd -t f 2>/dev/null"
    else
        [ -z "$cmd" ] && cmd="find . -type f 2>/dev/null"
    fi
    entry="$(eval "$cmd" | fzf -m)"
    # To show only the file name
    # entry=$(find . -type f 2>/dev/null | fzf --delimiter / --with-nth=-1 --tiebreak=begin --info=hidden)
elif type sk >/dev/null 2>&1; then
	entry=$(find . -type f 2>/dev/null | sk)
else
    exit 1
fi

# Check for picker mode
if [ "$3" ]; then
    if [ "$entry" ]; then
        case "$entry" in
            /*) fullpath="$entry" ;;
            *)  fullpath="$PWD/$entry" ;;
        esac
        if [ "-" = "$3" ]; then
            printf "%s\n" "$fullpath"
        else
            printf "%s\n" "$fullpath" > "$3"
        fi

        # Tell `nnn` to clear its internal selection
        printf "%s" "0p" > "$NNN_PIPE"
    fi

    exit 0
fi

if [ "$USE_NUKE" -ne 0 ]; then
    "$NUKE" "$entry"
    exit 0
fi

# Open the file (works for a single file only)
cmd_file=""
cmd_open=""
if uname | grep -q "Darwin"; then
    cmd_file="file -bIL"
    cmd_open="open"
else
    cmd_file="file -biL"
    cmd_open="xdg-open"
fi

case "$($cmd_file "$entry")" in
    *text*)
        "${VISUAL:-$EDITOR}" "$entry" ;;
    *)
        $cmd_open "$entry" >/dev/null 2>&1 ;;
esac
